﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем КлиентскийКэш;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	УстановитьУсловноеОформление();
	
	Если ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
		ВызватьИсключение НСтр("ru = 'Создание нового элемента копированием запрещено.'");
	КонецЕсли;
	
	Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма
		И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		Отказ = Истина;
		ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Работа с печатными формами не поддерживается.'"));
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
		ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
	КонецЕсли;
	
	// Проверка возможности загрузки новых обработок в информационную базу.
	ЭтоНовый = Объект.Ссылка.Пустая();
	ПравоДобавления = ДополнительныеОтчетыИОбработки.ПравоДобавления();
	Если Не ПравоДобавления Тогда
		Если ЭтоНовый Тогда
			ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа для добавления дополнительных отчетов или обработок.'");
		Иначе
			Элементы.ЗагрузитьИзФайла.Видимость = Ложь;
			Элементы.ВыгрузитьВФайл.Видимость = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	// Ограничение возможности выбора вида публикации в зависимости от настроек информационной базы.
	Элементы.Публикация.СписокВыбора.Очистить();
	ДоступныеВидыПубликации = ДополнительныеОтчетыИОбработкиПовтИсп.ДоступныеВидыПубликации();
	Для Каждого ВидПубликации Из ДоступныеВидыПубликации Цикл
		Элементы.Публикация.СписокВыбора.Добавить(ВидПубликации);
	КонецЦикла;
	
	// Ограничение отображения расширенной информации.
	ОтображениеРасширеннойИнформации = ДополнительныеОтчетыИОбработки.ОтображатьРасширеннуюИнформацию(Объект.Ссылка);
	Элементы.СтраницаДополнительнаяИнформация.Видимость = ОтображениеРасширеннойИнформации;
	
	// Ограничение возможности загрузки обработки из файла / сохранения в файл.
	Если Не ДополнительныеОтчетыИОбработки.ВозможнаЗагрузкаОбработкиИзФайла(Объект.Ссылка) Тогда
		Элементы.ЗагрузитьИзФайла.Видимость = Ложь;
	КонецЕсли;
	Если Не ДополнительныеОтчетыИОбработки.ВозможнаВыгрузкаОбработкиВФайл(Объект.Ссылка) Тогда
		Элементы.ВыгрузитьВФайл.Видимость = Ложь;
	КонецЕсли;
	
	ВидДополнительнаяОбработка = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
	ВидДополнительныйОтчет     = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
	ВидОтчет                   = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет;
	
	Параметры.Свойство("ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии", ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии);
	
	Если ЭтоНовый Тогда
		Объект.ИспользоватьДляФормыОбъекта = Истина;
		Объект.ИспользоватьДляФормыСписка  = Истина;
		ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии = Истина;
	КонецЕсли;
	
	Если ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии И Не Элементы.ЗагрузитьИзФайла.Видимость Тогда
		ВызватьИсключение НСтр("ru = 'Недостаточно прав для загрузки дополнительных отчетов и обработок'");
	КонецЕсли;
	
	ЗаполнитьКоманды();
	
	АдресРазрешений = ПоместитьВоВременноеХранилище(
		РеквизитФормыВЗначение("Объект").Разрешения.Выгрузить(),
		УникальныйИдентификатор);
	
	УстановитьВидимостьДоступность();
	
	РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
	КлиентскийКэш = Новый Структура;
	
	Если ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии Тогда
		ПодключитьОбработчикОжидания("ОбновитьИзФайла", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.ДополнительныеОтчетыИОбработки.Форма.РазмещениеВРазделах") Тогда
		
		Если ТипЗнч(ВыбранноеЗначение) <> Тип("СписокЗначений") Тогда
			Возврат;
		КонецЕсли;
		
		Объект.Разделы.Очистить();
		Для Каждого ЭлементСписка Из ВыбранноеЗначение Цикл
			НоваяСтрока = Объект.Разделы.Добавить();
			НоваяСтрока.Раздел = ЭлементСписка.Значение;
		КонецЦикла;
		
		Модифицированность = Истина;
		УстановитьВидимостьДоступность();
		
	ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.ДополнительныеОтчетыИОбработки.Форма.БыстрыйДоступКДополнительнымОтчетамИОбработкам") Тогда
		
		Если ТипЗнч(ВыбранноеЗначение) <> Тип("СписокЗначений") Тогда
			Возврат;
		КонецЕсли;
		
		ЭлементКоманда = Объект.Команды.НайтиПоИдентификатору(КлиентскийКэш.ИдентификаторСтрокиКоманды);
		Если ЭлементКоманда = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		Найденные = БыстрыйДоступ.НайтиСтроки(Новый Структура("ИдентификаторКоманды", ЭлементКоманда.Идентификатор));
		Для Каждого СтрокаТаблицы Из Найденные Цикл
			БыстрыйДоступ.Удалить(СтрокаТаблицы);
		КонецЦикла;
		
		Для Каждого ЭлементСписка Из ВыбранноеЗначение Цикл
			СтрокаТаблицы = БыстрыйДоступ.Добавить();
			СтрокаТаблицы.ИдентификаторКоманды = ЭлементКоманда.Идентификатор;
			СтрокаТаблицы.Пользователь = ЭлементСписка.Значение;
		КонецЦикла;
		
		ЭлементКоманда.БыстрыйДоступПредставление = ПредставлениеБыстрогоДоступаПользователей(ВыбранноеЗначение.Количество());
		Модифицированность = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "ВыборОбъектовМетаданных" Тогда
		
		ЗагрузитьВыбранныеОбъектыМетаданных(Параметр);
		
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
			ОбновитьЭлементыДополнительныхРеквизитов();
			МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
		КонецЕсли;
	КонецЕсли
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	
	Если ДополнительныеОтчетыИОбработки.ВозможнаВыгрузкаОбработкиВФайл(Объект.Ссылка) Тогда
		
		АдресДанныхОбработки = ПоместитьВоВременноеХранилище(
			ТекущийОбъект.ХранилищеОбработки.Получить(),
			УникальныйИдентификатор);
		
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка);
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ДанныеРегистра.ИдентификаторКоманды,
	|	ДанныеРегистра.Пользователь
	|ИЗ
	|	РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ДанныеРегистра
	|ГДЕ
	|	ДанныеРегистра.ДополнительныйОтчетИлиОбработка = &Ссылка
	|	И ДанныеРегистра.Доступно = ИСТИНА
	|	И НЕ ДанныеРегистра.Пользователь.ПометкаУдаления
	|	И НЕ ДанныеРегистра.Пользователь.Недействителен";
	БыстрыйДоступ.Загрузить(Запрос.Выполнить().Выгрузить());
	
	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом

КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если РегистрацияОбработки И ДополнительныеОтчетыИОбработки.ВозможнаЗагрузкаОбработкиИзФайла(Объект.Ссылка) Тогда
		ДвоичныеДанныеОбработки = ПолучитьИзВременногоХранилища(АдресДанныхОбработки);
		ТекущийОбъект.ХранилищеОбработки = Новый ХранилищеЗначения(ДвоичныеДанныеОбработки, Новый СжатиеДанных(9));
	КонецЕсли;
	
	Если Объект.Вид = ВидДополнительнаяОбработка ИЛИ Объект.Вид = ВидДополнительныйОтчет Тогда
		ТекущийОбъект.ДополнительныеСвойства.Вставить("АктуальныеКоманды", Объект.Команды.Выгрузить());
	Иначе
		БыстрыйДоступ.Очистить();
	КонецЕсли;
	
	ТекущийОбъект.ДополнительныеСвойства.Вставить("БыстрыйДоступ", БыстрыйДоступ.Выгрузить());
	ТекущийОбъект.ДополнительныеСвойства.Вставить("НазначениеВариантаОтчета", НазначениеВариантаОтчета);
	
	ТекущийОбъект.Разрешения.Загрузить(ПолучитьИзВременногоХранилища(АдресРазрешений));
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом

	Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ОшибкаПодключения") Тогда
		ТекстСообщения = ТекущийОбъект.ДополнительныеСвойства.ОшибкаПодключения;
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
	КонецЕсли;
	ЭтоНовый = Ложь;
	Если РегистрацияОбработки Тогда
		ОбновитьПовторноИспользуемыеЗначения();
		РегистрацияОбработки = Ложь;
	КонецЕсли;
	ЗаполнитьКоманды();
	УстановитьВидимостьДоступность();
	
	Если Объект.Публикация <> Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена
		И Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма
		И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МодульУправлениеПечатью.ОтключитьКомандыПечати(ВыбранныеОбъектыНазначения().ВыгрузитьЗначения(), ОтключаемыеКоманды().ВыгрузитьЗначения());
	КонецЕсли;
	
	СтандартныеПодсистемыСервер.ОповеститьВсеСеансыОбУстареванииПовторноИспользуемыхЗначений(Истина);
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ВариантыДополнительногоОтчетаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ВариантыДополнительногоОтчетаПередНачаломИзменения(Элемент, Отказ)
	Отказ = Истина;
	ОткрытьВариант();
КонецПроцедуры

&НаКлиенте
Процедура ВариантыДополнительногоОтчетаПередУдалением(Элемент, Отказ)
	Отказ = Истина;
	Вариант = Элементы.ВариантыДополнительногоОтчета.ТекущиеДанные;
	Если Вариант = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ Вариант.Пользовательский Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Пометка на удаление предопределенного варианта отчета запрещена.'"));
		Возврат;
	КонецЕсли;
	
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Пометить ""%1"" на удаление?'"), Вариант.Наименование);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Вариант", Вариант);
	Обработчик = Новый ОписаниеОповещения("ВариантыДополнительногоОтчетаПередУдалениемЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьДляФормыСпискаПриИзменении(Элемент)
	Если НЕ Объект.ИспользоватьДляФормыОбъекта И НЕ Объект.ИспользоватьДляФормыСписка Тогда
		Объект.ИспользоватьДляФормыОбъекта = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьДляФормыОбъектаПриИзменении(Элемент)
	Если НЕ Объект.ИспользоватьДляФормыОбъекта И НЕ Объект.ИспользоватьДляФормыСписка Тогда
		Объект.ИспользоватьДляФормыСписка = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияВключениеПрофилейБезопасностиНадписьОбработкаНавигационнойСсылки(Элемент, Ссылка, СтандартнаяОбработка)
	
	Если Ссылка = "int://sp-on" Тогда
		
		МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент");
		МодульРаботаВБезопасномРежимеКлиент.ОткрытьДиалогНастройкиИспользованияПрофилейБезопасности();
		СтандартнаяОбработка = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РазмещениеКомандНажатие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если Объект.Вид = ВидДополнительныйОтчет ИЛИ Объект.Вид = ВидДополнительнаяОбработка Тогда
		// Выбор разделов
		Разделы = Новый СписокЗначений;
		Для Каждого СтрокаТаблицы Из Объект.Разделы Цикл
			Разделы.Добавить(СтрокаТаблицы.Раздел);
		КонецЦикла;
		
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("Разделы",      Разделы);
		ПараметрыФормы.Вставить("ВидОбработки", Объект.Вид);
		
		ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.РазмещениеВРазделах", ПараметрыФормы, ЭтотОбъект);
	Иначе
		// Выбор объектов метаданных
		ПараметрыФормы = ПодготовитьПараметрыФормыВыборОбъектовМетаданных();
		ОткрытьФорму("ОбщаяФорма.ВыборОбъектовМетаданных", ПараметрыФормы);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтраницыВариантыКомандыРазрешенияПриСменеСтраницы(Элемент, ТекущаяСтраница)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства")
		И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты"
		И Не ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
		
		СвойстваВыполнитьОтложеннуюИнициализацию();
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыОбъектКоманды

&НаКлиенте
Процедура ОбъектКомандыБыстрыйДоступПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ИзменитьБыстрыйДоступ();
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыБыстрыйДоступПредставлениеОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыРегламентноеЗаданиеИспользованиеПриИзменении(Элемент)
	ИзменитьРегламентноеЗадание(Ложь, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыРегламентноеЗаданиеПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ИзменитьРегламентноеЗадание(Истина, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыРегламентноеЗаданиеПредставлениеОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыНастроитьБыстрыйДоступ(Команда)
	ИзменитьБыстрыйДоступ();
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыНастроитьРасписание(Команда)
	ИзменитьРегламентноеЗадание(Истина, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОбъектКомандыПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура КомандаЗаписатьИЗакрыть(Команда)
	ЗаписатьНаКлиенте(Истина);
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаписать(Команда)
	ЗаписатьНаКлиенте(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
	ОбновитьИзФайла();
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьВФайл(Команда)
	ПараметрыВыгрузки = Новый Структура;
	ПараметрыВыгрузки.Вставить("ЭтоОтчет", Объект.Вид = ВидОтчет Или Объект.Вид = ВидДополнительныйОтчет);
	ПараметрыВыгрузки.Вставить("ИмяФайла", Объект.ИмяФайла);
	ПараметрыВыгрузки.Вставить("АдресДанныхОбработки", АдресДанныхОбработки);
	ДополнительныеОтчетыИОбработкиКлиент.ВыгрузитьВФайл(ПараметрыВыгрузки);
КонецПроцедуры

&НаКлиенте
Процедура ВариантыДополнительногоОтчетаОткрыть(Команда)
	Вариант = Элементы.ВариантыДополнительногоОтчета.ТекущиеДанные;
	Если Вариант = Неопределено Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Выберите вариант отчета.'"));
		Возврат;
	КонецЕсли;
	
	ДополнительныеОтчетыИОбработкиКлиент.ОткрытьВариантДополнительногоОтчета(Объект.Ссылка, Вариант.КлючВарианта);
КонецПроцедуры

&НаКлиенте
Процедура РазместитьВРазделах(Команда)
	МассивВариантов = Новый Массив;
	Для Каждого ИдентификаторСтроки Из Элементы.ВариантыДополнительногоОтчета.ВыделенныеСтроки Цикл
		Вариант = ВариантыДополнительногоОтчета.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если ЗначениеЗаполнено(Вариант.Ссылка) Тогда
			МассивВариантов.Добавить(Вариант.Ссылка);
		КонецЕсли;
	КонецЦикла;
	
	// Открывает диалог размещения нескольких вариантов отчетов в разделах командного интерфейса.
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
		МодульВариантыОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВариантыОтчетовКлиент");
		МодульВариантыОтчетовКлиент.ОткрытьДиалогРазмещенияВариантовВРазделах(МассивВариантов);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НастроитьВидимость(Команда)
	Если Модифицированность Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьВидимостьЗавершение", ЭтотОбъект);
		ТекстВопроса = НСтр("ru = 'Для настройки видимости команд печати запишите обработку. Продолжить?'");
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'"));
		Кнопки.Добавить(КодВозвратаДиалога.Отмена);
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);
	Иначе
		ОткрытьФормуНастроекПодменюПечать();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
	СтрокаТаблицыКоманд = Элементы.ОбъектКоманды.ТекущиеДанные;
	Если СтрокаТаблицыКоманд = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Не СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы")
		И Не СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода")
		И Не СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода")
		И Не СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда
		Возврат;
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторВыполняемойКоманды", СтрокаТаблицыКоманд.Идентификатор);
	Обработчик = Новый ОписаниеОповещения("ВыполнитьКомандуПослеПодтвержденияЗаписи", ЭтотОбъект, Контекст);
	
	Если Объект.Ссылка.Пустая() Или Модифицированность Тогда
		ТекстВопроса = НСтр("ru = 'Для выполнения команды запишите данные.'");
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить("ЗаписатьИПродолжить", НСтр("ru = 'Записать и продолжить'"));
		Кнопки.Добавить(КодВозвратаДиалога.Отмена);
		ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки);
	Иначе
		ВыполнитьОбработкуОповещения(Обработчик, "ПродолжитьБезЗаписи");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбъектКомандыРегламентноеЗаданиеИспользование.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбъектКомандыРегламентноеЗаданиеПредставление.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Команды.РегламентноеЗаданиеРазрешено");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ОбъектКомандыРегламентноеЗаданиеПредставление.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Команды.РегламентноеЗаданиеИспользование");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент

&НаКлиенте
Процедура ЗаписатьНаКлиенте(ЗакрытьПослеЗаписи)
	
	Обработчик = Новый ОписаниеОповещения("ПродолжитьЗаписьНаКлиенте", ЭтотОбъект, ЗакрытьПослеЗаписи);
	ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.ОК);
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьЗаписьНаКлиенте(Результат, ЗакрытьПослеЗаписи)  Экспорт
	
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("РегистрацияОбработки", РегистрацияОбработки);
	ПараметрыЗаписи.Вставить("ЗакрытьПослеЗаписи", ЗакрытьПослеЗаписи);
	
	Успех = Записать(ПараметрыЗаписи);
	Если Не Успех Тогда
		Возврат;
	КонецЕсли;
	
	Если ПараметрыЗаписи.РегистрацияОбработки Тогда
		ОбновитьПовторноИспользуемыеЗначения();
		ТекстОповещения = НСтр("ru = 'Для применения изменений в открытых окнах закройте их и откройте заново.'");
		ПоказатьОповещениеПользователя(, , ТекстОповещения);
	КонецЕсли;
	ЗаписатьНаКлиентеЗавершение(ПараметрыЗаписи);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьНаКлиентеЗавершение(ПараметрыЗаписи)
	Если ПараметрыЗаписи.ЗакрытьПослеЗаписи И Открыта() Тогда
		Закрыть();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайла()
	Оповещение = Новый ОписаниеОповещения("ОбновитьИзФайлаПослеПодтверждения", ЭтотОбъект);
	ПараметрыФормы = Новый Структура("Ключ", "ПередДобавлениемДополнительногоОтчетаИлиОбработки");
	ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы, , , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаПослеПодтверждения(Ответ, ПараметрыРегистрации) Экспорт
	Если Ответ <> "Продолжить" Тогда
		ОбновитьИзФайлаЗавершение(Неопределено, ПараметрыРегистрации);
		Возврат;
	КонецЕсли;
	
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Успех", Ложь);
	ПараметрыРегистрации.Вставить("АдресДанныхОбработки", АдресДанныхОбработки);
	
	Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаПослеВыбораФайла", ЭтотОбъект, ПараметрыРегистрации);
	
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.Диалог.Фильтр = ДополнительныеОтчетыИОбработкиКлиентСервер.ФильтрДиалоговВыбораИСохранения();
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	
	Если Объект.Ссылка.Пустая() Тогда
		ПараметрыЗагрузки.Диалог.ИндексФильтра = 0;
		ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл внешнего отчета или обработки'");
	ИначеЕсли Объект.Вид = ВидДополнительныйОтчет Или Объект.Вид = ВидОтчет Тогда
		ПараметрыЗагрузки.Диалог.ИндексФильтра = 1;
		ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл внешнего отчета'");
	Иначе
		ПараметрыЗагрузки.Диалог.ИндексФильтра = 2;
		ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл внешней обработки'");
	КонецЕсли;
	
	ФайловаяСистемаКлиент.ЗагрузитьФайл(Обработчик, ПараметрыЗагрузки, Объект.ИмяФайла);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаПослеВыбораФайла(ОписаниеФайла, ПараметрыРегистрации) Экспорт
	Если ОписаниеФайла = Неопределено Тогда
		ОбновитьИзФайлаЗавершение(Неопределено, ПараметрыРегистрации);
		Возврат;
	КонецЕсли;
	
	Ключи = Новый Структура("ИмяФайла, ЭтоОтчет, ОтключатьПубликацию, ОтключатьКонфликтующие, Конфликтующие");
	ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыРегистрации, Ключи, Ложь);
	
	ПараметрыРегистрации.ОтключатьПубликацию = Ложь;
	ПараметрыРегистрации.ОтключатьКонфликтующие = Ложь;
	ПараметрыРегистрации.Конфликтующие = Новый СписокЗначений;
	
	МассивПодстрок = СтрРазделить(ОписаниеФайла.Имя, ПолучитьРазделительПути(), Ложь);
	ПараметрыРегистрации.ИмяФайла = МассивПодстрок.Получить(МассивПодстрок.ВГраница());
	РасширениеФайла = ВРег(Прав(ПараметрыРегистрации.ИмяФайла, 3));
	
	Если РасширениеФайла = "ERF" Тогда
		ПараметрыРегистрации.ЭтоОтчет = Истина;
	ИначеЕсли РасширениеФайла = "EPF" Тогда
		ПараметрыРегистрации.ЭтоОтчет = Ложь;
	Иначе
		ПараметрыРегистрации.Успех = Ложь;
		ОбработчикРезультата = Новый ОписаниеОповещения("ОбновитьИзФайлаЗавершение", ЭтотОбъект, ПараметрыРегистрации);
		ТекстПредупреждения = НСтр("ru = 'Расширение файла не соответствует расширению внешнего отчета (ERF) или обработки (EPF).'");
		ПараметрыВозврата = Новый Структура;
		ПараметрыВозврата.Вставить("Обработчик", ОбработчикРезультата);
		ПараметрыВозврата.Вставить("Результат",  Неопределено);
		ОбработчикПростогоДиалога = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыВозврата);
		ПоказатьПредупреждение(ОбработчикПростогоДиалога, ТекстПредупреждения);
		Возврат;
	КонецЕсли;
	
	ПараметрыРегистрации.АдресДанныхОбработки = ОписаниеФайла.Хранение;
	
	ОбновитьИзФайлаИСообщить(ПараметрыРегистрации);
КонецПроцедуры

&НаКлиенте
Процедура ВернутьРезультатПослеЗакрытияПростогоДиалога(ПараметрыОбработчика) Экспорт
	Если ТипЗнч(ПараметрыОбработчика.Обработчик) = Тип("ОписаниеОповещения") Тогда
		ВыполнитьОбработкуОповещения(ПараметрыОбработчика.Обработчик, ПараметрыОбработчика.Результат);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаИСообщить(ПараметрыРегистрации)

	ОбновитьИзФайлаНаСервере(ПараметрыРегистрации);
	
	Если ПараметрыРегистрации.ОтключатьКонфликтующие Тогда
		// Отключается несколько объектов, потому динамические списки надо обновить.
		ОповеститьОбИзменении(Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки"));
	КонецЕсли;
	
	Если ПараметрыРегистрации.Успех Тогда
		ОповещениеЗаголовок = ?(ПараметрыРегистрации.ЭтоОтчет, НСтр("ru = 'Файл внешнего отчета загружен'"), НСтр("ru = 'Файл внешней обработки загружен'"));
		ОповещениеСсылка    = ?(ЭтоНовый, "", ПолучитьНавигационнуюСсылку(Объект.Ссылка));
		ОповещениеТекст     = ПараметрыРегистрации.ИмяФайла;
		ПоказатьОповещениеПользователя(ОповещениеЗаголовок, ОповещениеСсылка, ОповещениеТекст);
		ОбновитьИзФайлаЗавершение(Неопределено, ПараметрыРегистрации);
	ИначеЕсли ПараметрыРегистрации.ИмяОбъектаЗанято Тогда // Разбор причины отказа загрузки обработки и отображение информации пользователю.
		ПоказатьКонфликты(ПараметрыРегистрации);
	Иначе
		ОбработчикРезультата = Новый ОписаниеОповещения("ОбновитьИзФайлаЗавершение", ЭтотОбъект, ПараметрыРегистрации);
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОбработчикРезультата, ПараметрыРегистрации.ТекстОшибки, 
			РежимДиалогаВопрос.ОК, ПараметрыВопроса);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьКонфликты(ПараметрыРегистрации)
	
	Если ПараметрыРегистрации.КоличествоКонфликтующих > 1 Тогда
		Если ПараметрыРегистрации.ЭтоОтчет Тогда
			ЗаголовокВопроса = НСтр("ru = 'Конфликты при загрузке внешнего отчета'");
			ТекстВопроса = НСтр("ru = 'Внутреннее имя отчета ""[Name]""
			|уже занято существующими дополнительными отчетами ([Count]): 
			|[List].
			|
			|Выберите:
			|1. ""[Continue]"" - загрузить новый отчет в режиме отладки.
			|2. ""[Disable]"" - загрузить новый отчет, отключив публикацию всех конфликтующих отчетов.
			|3. ""[Open]"" - отменить загрузку и показать список конфликтующих отчетов.'");
		Иначе
			ЗаголовокВопроса = НСтр("ru = 'Конфликты при загрузке внешней обработки'");
			ТекстВопроса = НСтр("ru = 'Внутреннее имя обработки ""[Name]""
			|уже занято существующими дополнительными обработками ([Count]):
			|[List].
			|
			|Выберите:
			|1. ""[Continue]"" - загрузить новую обработку в режиме отладки.
			|2. ""[Disable]"" - загрузить новую обработку, отключив публикацию всех конфликтующих обработок.
			|3. ""[Open]"" - отменить загрузку и показать список конфликтующих обработок.'");
		КонецЕсли;
		ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить конфликтующие'");
		ПредставлениеКнопкиОткрыть = НСтр("ru = 'Отменить и показать список'");
	Иначе
		Если ПараметрыРегистрации.ЭтоОтчет Тогда
			ЗаголовокВопроса = НСтр("ru = 'Конфликт при загрузке внешнего отчета'");
			ТекстВопроса = НСтр("ru = 'Внутреннее имя отчета ""[Name]""
			|уже занято существующим дополнительным отчетом [List].
			|
			|Выберите:
			|1. ""[Continue]"" - загрузить новый отчет в режиме отладки.
			|2. ""[Disable]"" - загрузить новый отчет, отключив публикацию конфликтующего отчета.
			|3. ""[Open]"" - открыть карточку конфликтующего отчета.'");
			ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить другой отчет'");
		Иначе
			ЗаголовокВопроса = НСтр("ru = 'Конфликт при загрузке внешней обработки'");
			ТекстВопроса = НСтр("ru = 'Внутреннее имя обработки ""[Name]""
			|уже занято существующей дополнительной обработкой [List].
			|
			|Выберите:
			|1. ""[Continue]"" - загрузить новую обработку в режиме отладки.
			|2. ""[Disable]"" - загрузить новую обработку, отключив публикацию конфликтующей обработки.
			|3. ""[Open]"" - открыть карточку конфликтующей обработки.'");
			ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить другую обработку'");
		КонецЕсли;
		ПредставлениеКнопкиОткрыть = НСтр("ru = 'Отменить и открыть'");
	КонецЕсли;
	ПредставлениеКнопкиПродолжить = НСтр("ru = 'В режиме отладки'");
	ТекстВопроса = СтрЗаменить(ТекстВопроса, "[Name]",  ПараметрыРегистрации.ИмяОбъекта);
	ТекстВопроса = СтрЗаменить(ТекстВопроса, "[Count]", ПараметрыРегистрации.КоличествоКонфликтующих);
	ТекстВопроса = СтрЗаменить(ТекстВопроса, "[List]",  ПараметрыРегистрации.ПредставлениеЗанявших);
	ТекстВопроса = СтрЗаменить(ТекстВопроса, "[Disable]",  ПредставлениеКнопкиОтключить);
	ТекстВопроса = СтрЗаменить(ТекстВопроса, "[Open]",     ПредставлениеКнопкиОткрыть);
	ТекстВопроса = СтрЗаменить(ТекстВопроса, "[Continue]", ПредставлениеКнопкиПродолжить);
	
	КнопкиВопроса = Новый СписокЗначений;
	КнопкиВопроса.Добавить("ПродолжитьБезПубликации", ПредставлениеКнопкиПродолжить);
	КнопкиВопроса.Добавить("ОтключитьКонфликтующие",  ПредставлениеКнопкиОтключить);
	КнопкиВопроса.Добавить("ОтменитьИОткрыть",        ПредставлениеКнопкиОткрыть);
	КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена);
	
	Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаРазрешениеКонфликтов", ЭтотОбъект, ПараметрыРегистрации);
	ПоказатьВопрос(Обработчик, ТекстВопроса, КнопкиВопроса, , "ПродолжитьБезПубликации", ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаРазрешениеКонфликтов(Ответ, ПараметрыРегистрации) Экспорт
	Если Ответ = "ПродолжитьБезПубликации" Тогда
		// Повторный вызов сервера (публикация в режиме отладки) и обработка результата.
		ПараметрыРегистрации.ОтключатьПубликацию = Истина;
		ОбновитьИзФайлаИСообщить(ПараметрыРегистрации);
	ИначеЕсли Ответ = "ОтключитьКонфликтующие" Тогда
		// Повторный вызов сервера (с переводом конфликтующих в режим отладки) и обработка результата.
		ПараметрыРегистрации.ОтключатьКонфликтующие = Истина;
		ОбновитьИзФайлаИСообщить(ПараметрыРегистрации);
	ИначеЕсли Ответ = "ОтменитьИОткрыть" Тогда
		// Отмена и показ конфликтующих.
		// Список показывается когда конфликтует более одного элемента.
		ПоказатьСписок = (ПараметрыРегистрации.КоличествоКонфликтующих > 1);
		Если ПараметрыРегистрации.СтароеИмяОбъекта = ПараметрыРегистрации.ИмяОбъекта И Не ЭтоНовый Тогда
			// Или текущий элемент уже записан с конфликтующим именем.
			// В списке будут два элемента - текущий и конфликтующий.
			// Это позволит принять решение о том, какой из них отключать.
			ПоказатьСписок = Истина;
		КонецЕсли;
		Если ПоказатьСписок Тогда // Форма списка с отбором по конфликтующим.
			ФормаИмя = "Справочник.ДополнительныеОтчетыИОбработки.ФормаСписка";
			ФормаЗаголовок = НСтр("ru = 'Дополнительные отчеты и обработки с внутреннем именем ""%1""'");
			ФормаЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ФормаЗаголовок, ПараметрыРегистрации.ИмяОбъекта);
			ФормаПараметры = Новый Структура;
			ФормаПараметры.Вставить("Отбор", Новый Структура);
			ФормаПараметры.Отбор.Вставить("ИмяОбъекта", ПараметрыРегистрации.ИмяОбъекта);
			ФормаПараметры.Отбор.Вставить("ЭтоГруппа", Ложь);
			ФормаПараметры.Вставить("Заголовок", ФормаЗаголовок);
			ФормаПараметры.Вставить("Отображение", "Список");
		Иначе // Форма элемента
			ФормаИмя = "Справочник.ДополнительныеОтчетыИОбработки.ФормаОбъекта";
			ФормаПараметры = Новый Структура;
			ФормаПараметры.Вставить("Ключ", ПараметрыРегистрации.Конфликтующие[0].Значение);
		КонецЕсли;
		ОбновитьИзФайлаЗавершение(Неопределено, ПараметрыРегистрации);
		ОткрытьФорму(ФормаИмя, ФормаПараметры, Неопределено, Истина);
	Иначе // Отмена.
		ОбновитьИзФайлаЗавершение(Неопределено, ПараметрыРегистрации);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаЗавершение(ПустойРезультат, ПараметрыРегистрации) Экспорт
	Если ПараметрыРегистрации = Неопределено Или ПараметрыРегистрации.Успех = Ложь Тогда
		Если ПоказатьДиалогЗагрузкиИзФайлаПриОткрытии И Открыта() Тогда
			Закрыть();
		КонецЕсли;
	ИначеЕсли ПараметрыРегистрации.Успех = Истина Тогда
		Если Не Открыта() Тогда
			Открыть();
		КонецЕсли;
		Модифицированность = Истина;
		РегистрацияОбработки = Истина;
		АдресДанныхОбработки = ПараметрыРегистрации.АдресДанныхОбработки;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВариант()
	Вариант = Элементы.ВариантыДополнительногоОтчета.ТекущиеДанные;
	Если Вариант = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(Вариант.Ссылка) Тогда
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Вариант отчета ""%1"" не зарегистрирован.'"), Вариант.Наименование);
		ПоказатьПредупреждение(, ТекстОшибки);
	Иначе
		МодульВариантыОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВариантыОтчетовКлиент");
		МодульВариантыОтчетовКлиент.ПоказатьНастройкиОтчета(Вариант.Ссылка);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРегламентноеЗадание(РежимВыбора = Ложь, ИзмененФлажок = Ложь)
	
	ЭлементКоманда = Элементы.ОбъектКоманды.ТекущиеДанные;
	Если ЭлементКоманда = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ЭлементКоманда.ВариантЗапуска <> ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода")
		И ЭлементКоманда.ВариантЗапуска <> ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда
		ТекстОшибки = НСтр("ru = 'Команда с вариантом запуска ""%1""
		|не может использоваться в регламентных заданиях.'");
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Строка(ЭлементКоманда.ВариантЗапуска));
		ПоказатьПредупреждение(, ТекстОшибки);
		Если ИзмененФлажок Тогда
			ЭлементКоманда.РегламентноеЗаданиеИспользование = НЕ ЭлементКоманда.РегламентноеЗаданиеИспользование;
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	Если ИзмененФлажок И Не ЭлементКоманда.РегламентноеЗаданиеИспользование Тогда
		Возврат;
	КонецЕсли;
	
	Если ЭлементКоманда.РегламентноеЗаданиеРасписание.Количество() > 0 Тогда
		РасписаниеКоманды = ЭлементКоманда.РегламентноеЗаданиеРасписание.Получить(0).Значение;
	Иначе
		РасписаниеКоманды = Неопределено;
	КонецЕсли;
	
	Если ТипЗнч(РасписаниеКоманды) <> Тип("РасписаниеРегламентногоЗадания") Тогда
		РасписаниеКоманды = Новый РасписаниеРегламентногоЗадания;
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ЭлементКоманда", ЭлементКоманда);
	Контекст.Вставить("ОтключитьФлажокПриОтменеРедактирования", ИзмененФлажок);
	Обработчик = Новый ОписаниеОповещения("ПослеОкончанияРедактированияРасписания", ЭтотОбъект, Контекст);
	
	РедактированиеРасписания = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеКоманды);
	РедактированиеРасписания.Показать(Обработчик);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеОкончанияРедактированияРасписания(Расписание, Контекст) Экспорт
	ЭлементКоманда = Контекст.ЭлементКоманда;
	Если Расписание = Неопределено Тогда
		Если Контекст.ОтключитьФлажокПриОтменеРедактирования Тогда
			ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь;
		КонецЕсли;
	Иначе
		
		Если РазделениеВключено
			И Расписание.ПериодПовтораВТечениеДня <> 0
			И Расписание.ПериодПовтораВТечениеДня < 60 Тогда
			ТекстСообщения = НСтр("ru = 'Не допускается установка интервала повтора регламентного задания менее 60 секунд.'");
			ПоказатьПредупреждение(, ТекстСообщения);
			Возврат;
		КонецЕсли;
		
		ЭлементКоманда.РегламентноеЗаданиеРасписание.Очистить();
		ЭлементКоманда.РегламентноеЗаданиеРасписание.Добавить(Расписание);
		Если ДополнительныеОтчетыИОбработкиКлиентСервер.РасписаниеЗадано(Расписание) Тогда
			Модифицированность = Истина;
			ЭлементКоманда.РегламентноеЗаданиеИспользование = Истина;
			ЭлементКоманда.РегламентноеЗаданиеПредставление = Строка(Расписание);
		Иначе
			ЭлементКоманда.РегламентноеЗаданиеПредставление = НСтр("ru = 'Не заполнено'");
			Если ЭлементКоманда.РегламентноеЗаданиеИспользование Тогда
				ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь;
				ПоказатьОповещениеПользователя(
					НСтр("ru = 'Запуск по расписанию отключен'"),
					,
					НСтр("ru = 'Расписание не заполнено'"));
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьБыстрыйДоступ()
	ЭлементКоманда = Элементы.ОбъектКоманды.ТекущиеДанные;
	Если ЭлементКоманда = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Найденные = БыстрыйДоступ.НайтиСтроки(Новый Структура("ИдентификаторКоманды", ЭлементКоманда.Идентификатор));
	ПользователиСБыстрымДоступом = Новый СписокЗначений;
	Для Каждого СтрокаТаблицы Из Найденные Цикл
		ПользователиСБыстрымДоступом.Добавить(СтрокаТаблицы.Пользователь);
	КонецЦикла;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПользователиСБыстрымДоступом", ПользователиСБыстрымДоступом);
	ПараметрыФормы.Вставить("ПредставлениеКоманды",         ЭлементКоманда.Представление);
	
	КлиентскийКэш.Вставить("ИдентификаторСтрокиКоманды", ЭлементКоманда.ПолучитьИдентификатор());
	ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.БыстрыйДоступКДополнительнымОтчетамИОбработкам", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

// Параметры:
//   Ответ - КодВозвратаДиалога
//   ДополнительныеПараметры - Структура
//
&НаКлиенте
Процедура ВариантыДополнительногоОтчетаПередУдалениемЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		Вариант = ДополнительныеПараметры.Вариант;
		УдалитьВариантДополнительногоОтчета("ВнешнийОтчет." + Объект.ИмяОбъекта, Вариант.КлючВарианта);
		ВариантыДополнительногоОтчета.Удалить(Вариант);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьКомандуПослеПодтвержденияЗаписи(Ответ, Контекст) Экспорт
	Если Ответ = "ЗаписатьИПродолжить" Тогда
		ОчиститьСообщения();
		Если Не Записать() Тогда
			Возврат; // Запись не удалась, сообщения о причинах выводит платформа.
		КонецЕсли;
	ИначеЕсли Ответ <> "ПродолжитьБезЗаписи" Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.Ссылка.Пустая() Или Модифицированность Тогда
		Возврат; // Финальная проверка.
	КонецЕсли;
	
	СтрокаТаблицыКоманд = Элементы.ОбъектКоманды.ТекущиеДанные;
	Если СтрокаТаблицыКоманд = Неопределено
		Или СтрокаТаблицыКоманд.Идентификатор <> Контекст.ИдентификаторВыполняемойКоманды Тогда
		Найденные = Объект.Команды.НайтиСтроки(Новый Структура("Идентификатор", Контекст.ИдентификаторВыполняемойКоманды));
		Если Найденные.Количество() = 0 Тогда
			Возврат;
		КонецЕсли;
		СтрокаТаблицыКоманд = Найденные[0];
	КонецЕсли;
	
	ВыполняемаяКоманда = Новый Структура(
		"Ссылка, Представление,
		|Идентификатор, ВариантЗапуска, ПоказыватьОповещение, 
		|Модификатор, ОбъектыНазначения, ЭтоОтчет, Вид");
	ЗаполнитьЗначенияСвойств(ВыполняемаяКоманда, СтрокаТаблицыКоманд);
	ВыполняемаяКоманда.Ссылка = Объект.Ссылка;
	ВыполняемаяКоманда.Вид = Объект.Вид;
	ВыполняемаяКоманда.ЭтоОтчет = (Объект.Вид = ВидДополнительныйОтчет Или Объект.Вид = ВидОтчет);
	
	Если СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы") Тогда
		
		ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, ЭтотОбъект, ВыполняемаяКоманда.ОбъектыНазначения);
		
	ИначеЕсли СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода") Тогда
		
		ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКлиентскийМетодОбработки(ВыполняемаяКоманда, ЭтотОбъект, ВыполняемаяКоманда.ОбъектыНазначения);
		
	ИначеЕсли СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода")
		Или СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда
		
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Выполняется команда ""%1""'"),
			СтрокаТаблицыКоманд.Представление);
		ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48);
		
		ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор);
		
		ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния;
		ПараметрыОжидания.ОповещениеПользователя.Показать = Истина;
		ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
		
		ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполненияСервернойКомандыВФоне", ЭтотОбъект, ВыполняемаяКоманда);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗавершенияВыполненияСервернойКомандыВФоне(Задание, ВыполняемаяКоманда) Экспорт
	
	Если Задание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Задание.Статус = "Ошибка" Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось выполнить команду по причине:
				|%1.'"), Задание.КраткоеПредставлениеОшибки);
	Иначе
		Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
		ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ОповеститьФормы");
		Если ОповеститьФормы <> Неопределено Тогда
			СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент, Сервер

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеБыстрогоДоступаПользователей(КоличествоПользователей)
	
	Если КоличествоПользователей = 0 Тогда
		Возврат НСтр("ru = 'Нет'");
	КонецЕсли;
	
	БыстрыйДоступПредставление = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(
		НСтр("ru = ';%1 пользователь;;%1 пользователя;%1 пользователей;%1 пользователя'"), КоличествоПользователей);
	
	Возврат БыстрыйДоступПредставление;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Вызов сервера, Сервер

&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
	ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
	
	ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения");
	ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
	ПараметрыПроцедуры.ИдентификаторКоманды          = ВыполняемаяКоманда.Идентификатор;
	ПараметрыПроцедуры.ОбъектыНазначения             = ВыполняемаяКоманда.ОбъектыНазначения;
	
	НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
КонецФункции

&НаСервере
Процедура ОбновитьИзФайлаНаСервере(ПараметрыРегистрации)
	ОбъектСправочника = РеквизитФормыВЗначение("Объект");
	КомандыСохраненные = ОбъектСправочника.Команды.Выгрузить();
	РезультатРегистрации = ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку(ОбъектСправочника, ПараметрыРегистрации);
	АдресРазрешений = ПоместитьВоВременноеХранилище(ОбъектСправочника.Разрешения.Выгрузить(), УникальныйИдентификатор);
	ЗначениеВРеквизитФормы(ОбъектСправочника, "Объект");
	
	ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ПараметрыРегистрации, РезультатРегистрации, Истина);
	
	Если ПараметрыРегистрации.Успех Тогда
		ЗаполнитьКоманды(КомандыСохраненные);
		НазначениеВариантаОтчета = ПараметрыРегистрации.НазначениеВариантаОтчета;
	ИначеЕсли ПараметрыРегистрации.ИмяОбъектаЗанято Тогда
		ПредставлениеЗанявших = "";
		Для Каждого ЭлементСписка Из ПараметрыРегистрации.Конфликтующие Цикл
			Если СтрДлина(ПредставлениеЗанявших) > 80 Тогда
				ПредставлениеЗанявших = ПредставлениеЗанявших + "... ";
				Прервать;
			КонецЕсли;
			ПредставлениеЗанявших = ПредставлениеЗанявших
				+ ?(ПредставлениеЗанявших = "", "", ", ")
				+ """" + СокрЛП(ЭлементСписка.Представление) + """";
		КонецЦикла;
		ПараметрыРегистрации.Вставить("ПредставлениеЗанявших", ПредставлениеЗанявших);
		ПараметрыРегистрации.Вставить("КоличествоКонфликтующих", ПараметрыРегистрации.Конфликтующие.Количество());
	КонецЕсли;
	
	УстановитьВидимостьДоступность(ПараметрыРегистрации.Успех);
КонецПроцедуры

&НаСервере
Функция ПодготовитьПараметрыФормыВыборОбъектовМетаданных()
	ТаблицаОбъектовМетаданных = ДополнительныеОтчетыИОбработки.ПодключенныеОбъектыМетаданных(Объект.Вид);
	Если ТаблицаОбъектовМетаданных = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ФильтрПоОбъектамМетаданных = Новый СписокЗначений;
	ФильтрПоОбъектамМетаданных.ЗагрузитьЗначения(ТаблицаОбъектовМетаданных.ВыгрузитьКолонку("ПолноеИмя"));
	
	ВыбранныеОбъектыМетаданных = Новый СписокЗначений;
	ОбъектыНазначения = Новый Массив;
	Для Каждого ЭлементНазначение Из Объект.Назначение Цикл
		Если ТаблицаОбъектовМетаданных.Найти(ЭлементНазначение.ОбъектНазначения, "Ссылка") <> Неопределено Тогда
			ОбъектыНазначения.Добавить(ЭлементНазначение.ОбъектНазначения);
		КонецЕсли;
	КонецЦикла;
	
	ПолныеИменаОбъектовНазначения = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(ОбъектыНазначения, "ПолноеИмя");
	Для Каждого КлючИЗначение Из ПолныеИменаОбъектовНазначения Цикл
		ВыбранныеОбъектыМетаданных.Добавить(КлючИЗначение.Значение);
	КонецЦикла;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ФильтрПоОбъектамМетаданных", ФильтрПоОбъектамМетаданных);
	ПараметрыФормы.Вставить("ВыбранныеОбъектыМетаданных", ВыбранныеОбъектыМетаданных);
	ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Назначение дополнительной обработки'"));
	
	Возврат ПараметрыФормы;
КонецФункции

&НаСервере
Процедура ЗагрузитьВыбранныеОбъектыМетаданных(Параметр)
	Объект.Назначение.Очистить();
	
	Для Каждого ЭлементПараметр Из Параметр Цикл
		ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ЭлементПараметр.Значение);
		Если ОбъектМетаданных = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		СтрокаНазначение = Объект.Назначение.Добавить();
		СтрокаНазначение.ОбъектНазначения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных);
	КонецЦикла;
	
	Модифицированность = Истина;
	УстановитьВидимостьДоступность();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УдалитьВариантДополнительногоОтчета(КлючОбъекта, КлючВарианта)
	ХранилищаНастроек["ХранилищеВариантовОтчетов"].Удалить(КлючОбъекта, КлючВарианта, Неопределено);
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьДоступность(Регистрация = Ложь)
	
	ЭтоГлобальнаяОбработка = (Объект.Вид = ВидДополнительнаяОбработка ИЛИ Объект.Вид = ВидДополнительныйОтчет);
	ЭтоОтчет = (Объект.Вид = ВидДополнительныйОтчет ИЛИ Объект.Вид = ВидОтчет);
	
	Если Не Регистрация И Не ЭтоНовый И ЭтоОтчет Тогда
		ВариантыДополнительногоОтчетаЗаполнить();
	Иначе
		ВариантыДополнительногоОтчета.Очистить();
	КонецЕсли;
	
	КоличествоВариантов = ВариантыДополнительногоОтчета.Количество();
	КоличествоКоманд = Объект.Команды.Количество();
	КоличествоВидимыхЗакладок = 1;
	
	Если Объект.Вид = ВидДополнительныйОтчет И Объект.ИспользуетХранилищеВариантов Тогда
		КоличествоВидимыхЗакладок = КоличествоВидимыхЗакладок + 1;
		
		Элементы.СтраницыВарианты.Видимость = Истина;
		
		Если Регистрация ИЛИ КоличествоВариантов = 0 Тогда
			Элементы.СтраницыВарианты.ТекущаяСтраница = Элементы.ВариантыСкрытьДоЗаписи;
			Элементы.СтраницаВарианты.Заголовок = НСтр("ru = 'Варианты отчета'");
		Иначе
			Элементы.СтраницыВарианты.ТекущаяСтраница = Элементы.ВариантыПоказать;
			Элементы.СтраницаВарианты.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Варианты отчета (%1)'"),
				Формат(КоличествоВариантов, "ЧГ="));
		КонецЕсли;
	Иначе
		Элементы.СтраницыВарианты.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.СтраницаКоманды.Видимость = КоличествоКоманд > 0;
	Если КоличествоКоманд = 0 Тогда
		Элементы.СтраницаКоманды.Заголовок = НазваниеСтраницыКоманд();
	Иначе
		КоличествоВидимыхЗакладок = КоличествоВидимыхЗакладок + 1;
		Элементы.СтраницаКоманды.Заголовок = НазваниеСтраницыКоманд() + " (" + Формат(КоличествоКоманд, "ЧГ=") + ")";
	КонецЕсли;
	
	Элементы.ВыполнитьКоманду.Видимость = Ложь;
	Если ЭтоГлобальнаяОбработка И КоличествоКоманд > 0 Тогда
		Для Каждого СтрокаТаблицыКоманд Из Объект.Команды Цикл
			Если СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы")
				Или СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода")
				Или СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода")
				Или СтрокаТаблицыКоманд.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда
				Элементы.ВыполнитьКоманду.Видимость = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	КоличествоРазрешений = РазрешенияПрофиляБезопасности().Количество();
	РежимСовместимостиРазрешений = Объект.РежимСовместимостиРазрешений;
	
	БезопасныйРежим = Объект.БезопасныйРежим;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
		МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
		ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности();
	Иначе
		ИспользуютсяПрофилиБезопасности = Ложь;
	КонецЕсли;
	
	Если ПолучитьФункциональнуюОпцию("РаботаВМоделиСервиса") Или ИспользуютсяПрофилиБезопасности Тогда
		МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
		Если РежимСовместимостиРазрешений = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_1_3 Тогда
			Если БезопасныйРежим И КоличествоРазрешений > 0 И ИспользуютсяПрофилиБезопасности Тогда
				Если ЭтоНовый Тогда
					БезопасныйРежим = "";
				Иначе
					БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка);
				КонецЕсли;
			КонецЕсли;
		Иначе
			Если КоличествоРазрешений = 0 Тогда
				БезопасныйРежим = Истина;
			Иначе
				Если ИспользуютсяПрофилиБезопасности Тогда
					Если ЭтоНовый Тогда
						БезопасныйРежим = "";
					Иначе
						БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Объект.Ссылка);
					КонецЕсли;
				Иначе
					БезопасныйРежим = Ложь;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если КоличествоРазрешений = 0 Тогда
		
		Элементы.СтраницаРазрешения.Видимость = Ложь;
		Элементы.ГруппаБезопасныйРежимГлобальный.Видимость = Истина;
		Элементы.ДекорацияБезопасныйРежимЛожьНадпись.Видимость = (БезопасныйРежим = Ложь);
		Элементы.ДекорацияБезопасныйРежимИстинаНадпись.Видимость = (БезопасныйРежим = Истина);
		Элементы.ГруппаВключениеПрофилейБезопасности.Видимость = Ложь;
		
	Иначе
		
		КоличествоВидимыхЗакладок = КоличествоВидимыхЗакладок + 1;
		
		Элементы.СтраницаРазрешения.Видимость = Истина;
		Элементы.СтраницаРазрешения.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Разрешения (%1)'"),
			Формат(КоличествоРазрешений, "ЧГ="));
		
		Элементы.ГруппаБезопасныйРежимГлобальный.Видимость = Ложь;
		
		Элементы.ГруппаСтраницыРежимыСовместимостиРазрешений.ТекущаяСтраница = Элементы.СтраницаРазрешенияВерсия_2_2_2;
		
		Если БезопасныйРежим = Истина Тогда
			Элементы.СтраницыБезопасныйРежимСРазрешениями.ТекущаяСтраница = Элементы.СтраницаБезопасныйРежимСРазрешениями;
		ИначеЕсли БезопасныйРежим = Ложь Тогда
			Элементы.СтраницыБезопасныйРежимСРазрешениями.ТекущаяСтраница = Элементы.СтраницаНебезопасныйРежимСРазрешениями;
		ИначеЕсли ТипЗнч(БезопасныйРежим) = Тип("Строка") Тогда
			Элементы.СтраницыБезопасныйРежимСРазрешениями.ТекущаяСтраница = Элементы.СтраницаПерсональныйПрофильБезопасности;
			Элементы.ДекорацияПерсональныйПрофильБезопасностиНадпись.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Дополнительный отчет или обработка будет подключаться к программе с использованием ""персонального""
					|профиля безопасности %1, в котором будут разрешены только следующие операции:'"),
				БезопасныйРежим);
		Иначе
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 не является корректным режимом подключения для дополнительных отчетов и обработок,
					|требующих разрешений на использование профилей безопасности.'"),
				БезопасныйРежим);
		КонецЕсли;
		
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
			МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
			ДоступнаНастройкаПрофилейБезопасности = МодульРаботаВБезопасномРежимеСлужебный.ДоступнаНастройкаПрофилейБезопасности();
		Иначе
			ДоступнаНастройкаПрофилейБезопасности = Ложь;
		КонецЕсли;
		
		Если БезопасныйРежим = Ложь И Не ИспользуютсяПрофилиБезопасности И ДоступнаНастройкаПрофилейБезопасности Тогда
			Элементы.ГруппаВключениеПрофилейБезопасности.Видимость = Истина;
		Иначе
			Элементы.ГруппаВключениеПрофилейБезопасности.Видимость = Ложь;
		КонецЕсли;
		
		СформироватьСписокРазрешений();
		
	КонецЕсли;
	
	Элементы.СтраницыВариантыКомандыРазрешения.ОтображениеСтраниц = ОтображениеСтраницФормы[?(КоличествоВидимыхЗакладок > 1, "ЗакладкиСверху", "Нет")];
	
	ПредставлениеНазначения = "";
	Если ЭтоГлобальнаяОбработка Тогда
		Для Каждого СтрокаРаздел Из Объект.Разделы Цикл
			ПредставлениеРаздела = ДополнительныеОтчетыИОбработки.ПредставлениеРаздела(СтрокаРаздел.Раздел);
			Если ПредставлениеРаздела = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			ПредставлениеНазначения = ?(ПустаяСтрока(ПредставлениеНазначения), ПредставлениеРаздела,
				ПредставлениеНазначения + ", " + ПредставлениеРаздела);
		КонецЦикла;
	Иначе
		Для Каждого СтрокаНазначение Из Объект.Назначение Цикл
			ПредставлениеОбъекта = ДополнительныеОтчетыИОбработки.ПредставлениеОбъектаМетаданных(СтрокаНазначение.ОбъектНазначения);
			ПредставлениеНазначения = ?(ПустаяСтрока(ПредставлениеНазначения), ПредставлениеОбъекта,
				ПредставлениеНазначения + ", " + ПредставлениеОбъекта);
		КонецЦикла;
	КонецЕсли;
	Если ПредставлениеНазначения = "" Тогда
		ПредставлениеНазначения = НСтр("ru = 'Не определено'");
	КонецЕсли;
	
	Элементы.ОбъектКомандыБыстрыйДоступПредставление.Видимость       = ЭтоГлобальнаяОбработка;
	Элементы.ОбъектКомандыНастроитьБыстрыйДоступ.Видимость           = ЭтоГлобальнаяОбработка;
	Элементы.ОбъектКомандыРегламентноеЗаданиеПредставление.Видимость = ЭтоГлобальнаяОбработка;
	Элементы.ОбъектКомандыРегламентноеЗаданиеИспользование.Видимость = ЭтоГлобальнаяОбработка;
	Элементы.ОбъектКомандыНастроитьРасписание.Видимость              = ЭтоГлобальнаяОбработка;
	
	ЭтоПечатнаяФорма = Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма;
	Элементы.ТипыФорм.Видимость = Не ЭтоГлобальнаяОбработка И Не ЭтоПечатнаяФорма;
	Если Не Элементы.ТипыФорм.Видимость Тогда
		Объект.ИспользоватьДляФормыОбъекта = Истина;
		Объект.ИспользоватьДляФормыСписка = Истина;
	КонецЕсли;
	Элементы.НастроитьВидимость.Видимость = ЭтоПечатнаяФорма;
	Элементы.ОбъектКомандыКомментарий.Видимость = ЭтоПечатнаяФорма;
	
	Если ЭтоНовый Тогда
		Заголовок = ?(ЭтоОтчет, НСтр("ru = 'Дополнительный отчет (создание)'"), НСтр("ru = 'Дополнительная обработка (создание)'"));
	Иначе
		Заголовок = Объект.Наименование + " " + ?(ЭтоОтчет, НСтр("ru = '(Дополнительный отчет)'"), НСтр("ru = '(Дополнительная обработка)'"));
	КонецЕсли;
	
	Если КоличествоВариантов > 0 Тогда
		
		ВыводитьЗаголовокТаблицы = КоличествоВидимыхЗакладок <= 1 И Объект.Вид = ВидДополнительныйОтчет И Объект.ИспользуетХранилищеВариантов;
		
		Элементы.ВариантыДополнительногоОтчета.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы[?(ВыводитьЗаголовокТаблицы, "Верх", "Нет")];
		Элементы.ВариантыДополнительногоОтчета.Шапка               = НЕ ВыводитьЗаголовокТаблицы;
		Элементы.ВариантыДополнительногоОтчета.ГоризонтальныеЛинии = НЕ ВыводитьЗаголовокТаблицы;
		
	КонецЕсли;
	
	Если КоличествоКоманд > 0 Тогда
		
		ВыводитьЗаголовокТаблицы = КоличествоВидимыхЗакладок <= 1 И НЕ ЭтоГлобальнаяОбработка;
		
		Элементы.ОбъектКоманды.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы[?(ВыводитьЗаголовокТаблицы, "Верх", "Нет")];
		Элементы.ОбъектКоманды.Шапка               = НЕ ВыводитьЗаголовокТаблицы;
		Элементы.ОбъектКоманды.ГоризонтальныеЛинии = НЕ ВыводитьЗаголовокТаблицы;
		
	КонецЕсли;
	
	КлючСохраненияПоложенияОкна = ДополнительныеОтчетыИОбработки.ВидВСтроку(Объект.Вид);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Сервер

&НаСервере
Процедура СформироватьСписокРазрешений()
	
	ТаблицаРазрешений = ПолучитьИзВременногоХранилища(АдресРазрешений);// СправочникТабличнаяЧасть.ДополнительныеОтчетыИОбработки.Разрешения
	
	Разрешения = Новый Массив();
	
	МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
	
	Для Каждого Строка Из ТаблицаРазрешений Цикл
		Разрешение = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(МодульРаботаВБезопасномРежимеСлужебный.Пакет(), Строка.ВидРазрешения));
		ЗаполнитьЗначенияСвойств(Разрешение, Строка.Параметры.Получить());
		Разрешения.Добавить(Разрешение);
	КонецЦикла;
	
	Свойства = МодульРаботаВБезопасномРежимеСлужебный.СвойстваДляРегистраРазрешений(Объект.Ссылка);
	
	УстановитьПривилегированныйРежим(Истина);
	ПредставлениеРазрешений_2_2_2 = МодульРаботаВБезопасномРежимеСлужебный.ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов(
		Свойства.Тип, Свойства.Идентификатор, Свойства.Тип, Свойства.Идентификатор, Разрешения);
	УстановитьПривилегированныйРежим(Ложь);
	
КонецПроцедуры

&НаСервере
Функция РазрешенияПрофиляБезопасности()
	Возврат ПолучитьИзВременногоХранилища(АдресРазрешений);
КонецФункции

&НаСервере
Процедура ЗаполнитьКоманды(КомандыСохраненные = Неопределено)
	
	Объект.Команды.Сортировать("Представление");
	
	КомандыПечатиОбъекта = Неопределено;
	Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма
		И Объект.Назначение.Количество() = 1
		И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		КомандыПечатиОбъекта = МодульУправлениеПечатью.СтандартныеКомандыПечатиОбъекта(Объект.Назначение[0].ОбъектНазначения);
	КонецЕсли;
	
	Для Каждого ЭлементКоманда Из Объект.Команды Цикл
		Если Объект.Вид = ВидДополнительнаяОбработка ИЛИ Объект.Вид = ВидДополнительныйОтчет Тогда
			Найденные = БыстрыйДоступ.НайтиСтроки(Новый Структура("ИдентификаторКоманды", ЭлементКоманда.Идентификатор));
			ЭлементКоманда.БыстрыйДоступПредставление = ПредставлениеБыстрогоДоступаПользователей(
				Найденные.Количество());
		КонецЕсли;
		
		ЭлементКоманда.РегламентноеЗаданиеИспользование = Ложь;
		ЭлементКоманда.РегламентноеЗаданиеРазрешено = Ложь;
		
		Если Объект.Вид = ВидДополнительнаяОбработка
			И (ЭлементКоманда.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода
			ИЛИ ЭлементКоманда.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме) Тогда
			
			ЭлементКоманда.РегламентноеЗаданиеРазрешено = Истина;
			
			РегламентноеЗаданиеGUID = ЭлементКоманда.РегламентноеЗаданиеGUID;
			Если КомандыСохраненные <> Неопределено Тогда
				НайденнаяСтрока = КомандыСохраненные.Найти(ЭлементКоманда.Идентификатор, "Идентификатор");
				Если НайденнаяСтрока <> Неопределено Тогда
					РегламентноеЗаданиеGUID = НайденнаяСтрока.РегламентноеЗаданиеGUID;
				КонецЕсли;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(РегламентноеЗаданиеGUID) Тогда
				УстановитьПривилегированныйРежим(Истина);
				РегламентноеЗадание = РегламентныеЗаданияСервер.Задание(РегламентноеЗаданиеGUID);
				Если РегламентноеЗадание <> Неопределено Тогда
					ЭлементКоманда.РегламентноеЗаданиеGUID = РегламентноеЗаданиеGUID;
					ЭлементКоманда.РегламентноеЗаданиеПредставление = Строка(РегламентноеЗадание.Расписание);
					ЭлементКоманда.РегламентноеЗаданиеИспользование = РегламентноеЗадание.Использование;
					ЭлементКоманда.РегламентноеЗаданиеРасписание.Вставить(0, РегламентноеЗадание.Расписание);
				КонецЕсли;
				УстановитьПривилегированныйРежим(Ложь);
			КонецЕсли;
			Если Не ЗначениеЗаполнено(ЭлементКоманда.РегламентноеЗаданиеПредставление) Тогда
				ЭлементКоманда.РегламентноеЗаданиеПредставление = НСтр("ru = 'Не заполнено'");
			КонецЕсли;
		ИначеЕсли Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда
			Если Не ПустаяСтрока(ЭлементКоманда.ЗаменяемыеКоманды) И КомандыПечатиОбъекта <> Неопределено Тогда
				ИдентификаторыЗаменяемых = СтрРазделить(ЭлементКоманда.ЗаменяемыеКоманды, ",", Ложь);
				ПредставлениеЗаменяемыхКоманд = "";
				КоличествоЗаменяемых = 0;
				Фильтр = Новый Структура("Идентификатор, ФорматСохранения, СразуНаПринтер", Неопределено, Неопределено, Ложь);
				Для Каждого ИдентификаторЗаменяемойКоманды Из ИдентификаторыЗаменяемых Цикл
					Фильтр.Идентификатор = СокрЛП(ИдентификаторЗаменяемойКоманды);
					СписокЗаменяемыхКоманд = КомандыПечатиОбъекта.НайтиСтроки(Фильтр);
					// при неоднозначности в определении заменяемой команды замена не выполняется.
					Если СписокЗаменяемыхКоманд.Количество() = 1 Тогда
						ПредставлениеЗаменяемыхКоманд = ПредставлениеЗаменяемыхКоманд + ?(ПустаяСтрока(ПредставлениеЗаменяемыхКоманд), "", ", ") + """" + СписокЗаменяемыхКоманд[0].Представление + """";
						КоличествоЗаменяемых = КоличествоЗаменяемых + 1;
					КонецЕсли;
				КонецЦикла;
				Если КоличествоЗаменяемых > 0 Тогда
					Если КоличествоЗаменяемых = 1 Тогда
						ШаблонКомментария = НСтр("ru = 'Заменяет стандартную команду печати %1'");
					Иначе
						ШаблонКомментария = НСтр("ru = 'Заменяет стандартные команды печати: %1'");
					КонецЕсли;
					ЭлементКоманда.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонКомментария, ПредставлениеЗаменяемыхКоманд);
				КонецЕсли;
			КонецЕсли;
		Иначе
			ЭлементКоманда.РегламентноеЗаданиеПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Неприменимо для команд с вариантом запуска ""%1""'"),
				Строка(ЭлементКоманда.ВариантЗапуска));
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ВариантыДополнительногоОтчетаЗаполнить()
	ВариантыДополнительногоОтчета.Очистить();
	
	Попытка
		ВнешнийОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Объект.Ссылка);
	Исключение
		ТекстОшибки = НСтр("ru = 'Не удалось получить список вариантов отчета из-за ошибки, возникшей при подключении этого отчета:'");
		ТекстСообщения = ТекстОшибки + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецПопытки;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
		МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");
		
		ОтчетМетаданные = ВнешнийОбъект.Метаданные();
		СхемаКДМетаданные = ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных;// ОбъектМетаданных
		Если СхемаКДМетаданные <> Неопределено Тогда
			СхемаКД = ВнешнийОбъект.ПолучитьМакет(СхемаКДМетаданные.Имя);
			Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл
				КлючВарианта = ВариантНастроекКД.Имя;
				ВариантСсылка = МодульВариантыОтчетов.ВариантОтчета(Объект.Ссылка, КлючВарианта);
				Если ВариантСсылка <> Неопределено Тогда
					Вариант = ВариантыДополнительногоОтчета.Добавить();
					Вариант.КлючВарианта = КлючВарианта;
					Вариант.Наименование = ВариантНастроекКД.Представление;
					Вариант.Пользовательский = Ложь;
					Вариант.ИндексКартинки = 5;
					Вариант.Ссылка = ВариантСсылка;
				КонецЕсли;
			КонецЦикла;
		Иначе
			КлючВарианта = "";
			ВариантСсылка = МодульВариантыОтчетов.ВариантОтчета(Объект.Ссылка, КлючВарианта);
			Если ВариантСсылка <> Неопределено Тогда
				Вариант = ВариантыДополнительногоОтчета.Добавить();
				Вариант.КлючВарианта = КлючВарианта;
				Вариант.Наименование = ОтчетМетаданные.Представление();
				Вариант.Пользовательский = Ложь;
				Вариант.ИндексКартинки = 5;
				Вариант.Ссылка = ВариантСсылка;
			КонецЕсли;
		КонецЕсли;
	Иначе
		МодульВариантыОтчетов = Неопределено;
	КонецЕсли;
	
	Если Объект.ИспользуетХранилищеВариантов Тогда
		Хранилище = ХранилищаНастроек["ХранилищеВариантовОтчетов"];
		КлючОбъекта = Объект.Ссылка;
		СписокНастроек = МодульВариантыОтчетов.КлючиВариантовОтчета(КлючОбъекта);
	Иначе
		Хранилище = ХранилищеВариантовОтчетов;
		КлючОбъекта = "ВнешнийОтчет." + Объект.ИмяОбъекта;
		СписокНастроек = Хранилище.ПолучитьСписок(КлючОбъекта);
	КонецЕсли;
	
	Для Каждого ЭлементСписка Из СписокНастроек Цикл
		Вариант = ВариантыДополнительногоОтчета.Добавить();
		Вариант.КлючВарианта = ЭлементСписка.Значение;
		Вариант.Наименование = ЭлементСписка.Представление;
		Вариант.Пользовательский = Истина;
		Вариант.ИндексКартинки = 3;
		Если МодульВариантыОтчетов <> Неопределено Тогда
			Вариант.Ссылка = МодульВариантыОтчетов.ВариантОтчета(Объект.Ссылка, Вариант.КлючВарианта);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ВыбранныеОбъектыНазначения()
	Результат = Новый СписокЗначений;
	Результат.ЗагрузитьЗначения(Объект.Назначение.Выгрузить(, "ОбъектНазначения").ВыгрузитьКолонку("ОбъектНазначения"));
	Возврат Результат;
КонецФункции

&НаКлиенте
Процедура НастроитьВидимостьЗавершение(РезультатДиалога, ДополнительныеПараметры) Экспорт
	Если РезультатДиалога <> "Продолжить" Тогда
		Возврат;
	КонецЕсли;
	Записать();
	ОткрытьФормуНастроекПодменюПечать();
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастроекПодменюПечать()
	МодульУправлениеПечатьюСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюСлужебныйКлиент");
	МодульУправлениеПечатьюСлужебныйКлиент.ОткрытьФормуНастроекПодменюПечать(ВыбранныеОбъектыНазначения());
КонецПроцедуры

&НаСервере
Функция ОтключаемыеКоманды()
	Результат = Новый СписокЗначений;
	Для Каждого Команда Из Объект.Команды Цикл
		Если Не ПустаяСтрока(Команда.ЗаменяемыеКоманды) Тогда
			СписокЗаменяемых = СтрРазделить(Команда.ЗаменяемыеКоманды, ",", Ложь);
			Для Каждого ЗаменяемаяКоманда Из СписокЗаменяемых Цикл
				Результат.Добавить(ЗаменяемаяКоманда);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
КонецФункции

&НаСервере
Функция НазваниеСтраницыКоманд()
	Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда
		Возврат НСтр("ru = 'Команды печати'");
	Иначе
		Возврат НСтр("ru = 'Команды'");
	КонецЕсли;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Дополнительные реквизиты

&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти
